package com.jacob.androidframe.util;

import java.util.regex.PatternSyntaxException;

public class UtilRegex
{
	// 只有字母、数字和下划线，且不能以下划线开头和结尾
	private static String	USER_NAME_ENG				= "^(?!_)(?!.*?_$)[a-zA-Z0-9_]+$";
	// 只含有汉字、数字、字母、下划线，且不能以下划线开头和结尾
	private static String	USER_NAME_CHN				= "^(?!_)(?!.*?_$)[a-zA-Z0-9_\u4e00-\u9fa5]+$";
	// E-mail地址
	private static String	EMAIL						= "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*((\\.[A-Za-z]{2,}){1}$)";
	// 纯数字
	private static String	DIGITS						= "^[\\d]*$";
	// 11位数字
	private static String	ELEVEN_DIGITS				= "^(\\d{11})$";
	// 8位或11位数字
	private static String	EIGHT_OR_ELEVEN_DIGITS		= "^(\\d{8}|\\d{11})$";
	// 数字1开头，后面10位数字
	private static String	LEAD_WITH_1_THEN_TEN_DIGITS	= "^[1][\\d]{10}$";
	// +86、086、86开头的数字
	private static String	LEAD_WITH_86	= "^[+|0]{1}86|^86";
	


	/**
	 * 验证String是否只有字母、数字和下划线，且不以下划线开头和结尾
	 * 
	 * @param pTargetString
	 *            需要验证的String
	 * @return 验证结果
	 */
	public static boolean isUserNameEng(String pTargetString)
	{
		return matches(pTargetString, USER_NAME_ENG);
	}

	/**
	 * 验证String是否只有汉字、字母、数字和下划线，且不以下划线开头和结尾
	 * 
	 * @param pTargetString
	 *            需要验证的String
	 * @return 验证结果
	 */
	public static boolean isUserNameChn(String pTargetString)
	{
		return matches(pTargetString, USER_NAME_CHN);
	}

	/**
	 * 验证String是否为E-Mail地址
	 * 
	 * @param pTargetString
	 *            需要验证的String
	 * @return 验证结果
	 */
	public static boolean isEmail(String pTargetString)
	{
		return matches(pTargetString, EMAIL);
	}

	/**
	 * 验证String是否为纯数字
	 * 
	 * @param pTargetString
	 *            需要验证的String
	 * @return 验证结果
	 */
	public static boolean isDigits(String pTargetString)
	{
		return matches(pTargetString, DIGITS);
	}
	
	/**
	 * 验证String是否为11位数字
	 * 
	 * @param pTargetString
	 *            需要验证的String
	 * @return 验证结果
	 */
	public static boolean isElevenDigits(String pTargetString)
	{
		return matches(pTargetString, ELEVEN_DIGITS);
	}
	
	/**
	 * 验证是否为11位数字
	 * 
	 * @param pTargetString
	 *            需要验证的int值
	 * @return 验证结果
	 */
	public static boolean isElevenDigits(int pTarget)
	{
		return matches(pTarget, ELEVEN_DIGITS);
	}
	
	/**
	 * 验证String是否为8位或者11位数字
	 * 
	 * @param pTargetString
	 *            需要验证的String
	 * @return 验证结果
	 */
	public static boolean isEightOrElevenDigits(String pTargetString)
	{
		return matches(pTargetString, EIGHT_OR_ELEVEN_DIGITS);
	}
	
	/**
	 * 验证是否为8位或者11位数字
	 * 
	 * @param pTarget
	 *            需要验证的int值
	 * @return 验证结果
	 */
	public static boolean isEightOrElevenDigits(int pTarget)
	{
		return matches(pTarget, EIGHT_OR_ELEVEN_DIGITS);
	}
	
	/**
	 * 验证String是否为数字"1"开头，后面跟着10位数字
	 * 
	 * @param pTargetString
	 *            需要验证的String
	 * @return 验证结果
	 */
	public static boolean isLeadWith1ThenTenDigits(String pTargetString)
	{
		return matches(pTargetString, LEAD_WITH_1_THEN_TEN_DIGITS);
	}
	
	/**
	 * 验证是否为数字"1"开头，后面跟着10位数字
	 * 
	 * @param pTarget
	 *            需要验证的int值
	 * @return 验证结果
	 */
	public static boolean isLeadWith1ThenTenDigits(int pTarget)
	{
		return matches(pTarget, LEAD_WITH_1_THEN_TEN_DIGITS);
	}
	
	/**
	 * 验证String是否为+86、086、86开头
	 * 
	 * @param pTargetString
	 *            需要验证的String
	 * @return 验证结果
	 */
	public static boolean isLeadWith86(String pTargetString)
	{
		return matches(pTargetString, LEAD_WITH_86);
	}

	/**
	 * 验证是否为86开头
	 * 
	 * @param pTarget
	 *            需要验证的int值
	 * @return 验证结果
	 */
	public static boolean isLeadWith86(int pTarget)
	{
		return matches(pTarget, LEAD_WITH_86);
	}
	
	/**
	 * 传入字符串和正则表达式，返回该字符串是否匹配表达式。
	 * 
	 * @param pTargetString 要匹配的字符串
	 * @param pRegex 正则表达式
	 * @return 返回匹配结果。
	 * 若任意一个参数为null，返回false；
	 * 若正则表达式无效，返回false。
	 */
	public static boolean matches(String pTargetString, String pRegex)
	{
		try {
			return pTargetString.matches(pRegex);
		} catch (NullPointerException e) {
			return false;
		} catch (PatternSyntaxException e) {
			return false;
		}
	}
	/**
	 * 传入int值和正则表达式，返回该字符串是否匹配表达式。
	 * 
	 * @param pTarget 要匹配的int值
	 * @param pRegex 正则表达式
	 * @return 返回匹配结果。
	 * 若参数pRegex为null，返回false；
	 * 若正则表达式无效，返回false。
	 */
	public static boolean matches(int pTarget, String pRegex)
	{
		String _TargetString = String.valueOf(pTarget);
		return matches(_TargetString, pRegex);
	}
}
